package newx.com.config
{
	import com.cjson.CJSON;
	
	import flash.display.LoaderInfo;
	import flash.events.IEventDispatcher;
	
	import newx.BaseObject;
	
	/**
	 * 配置管理器：
	 * 用于协调各个配置文件的加载，使用，提供一种快捷访问有关配置文件的方式 
	 * @author riki
	 * 
	 */
	public class StaticIni extends BaseObject
	{
//		private static		var 	initArr		:BaseObject	=	null;
//		private static		var 	txtConfig	:TextData	=	null;
		private static		var		configClass	:Object		=	null;
		private static		var		langData	:Object		=	null;
		private static		var		iniData		:Object		=	null;
						
		public function StaticIni(target:IEventDispatcher=null)
		{
			super(target);
		}
		
//		/**
//		 * 加载配置 
//		 * @param type		：配置文件类型
//		 * @param configUrl	：配置文件地址
//		 * @param target	：时间监听载体
//		 */		
//		public static function loadInit(type:String,configUrl:String,complete:Function):void
//		{
//			if(initArr == null)
//			{
//				initArr	=	new BaseObject();
//			}
//			initArr.HandleProperties(type,new TextIni(configUrl,complete));
//		}
//		
//		/**
//		 * 获取某个配置文件的值
//		 * @param type		：配置文件类型
//		 * @param section	：项索引
//		 * @param key		：属性索引
//		 * @param index		：取值
//		 * 
//		 */			
//		public static function getContent(type:String,section:String, key:String, index:int = 1):String
//		{
//			if(initArr.CheckProperties(type))
//			{
//				return (initArr.GetProperties(type) as TextIni).getContent(section,key,index)
//			}
//			else
//			{
//				return null;
//			}
//		}
//		
//		/**
//		 * 加载字符串配置 
//		 * @param pathArr
//		 * @param target
//		 * 
//		 */		
//		public static function loadStrConfig(url:String,complete:Function):void
//		{
//			if(txtConfig == null)
//			{
//				txtConfig	=	new TextData();
//			}
//			txtConfig.loadText(url,complete);
//		}
//		
//		/**
//		 * 获取配置好的字符串 
//		 * @param key	字符串索引
//		 * @return 		字符串
//		 * 
//		 */		
//		public static function getStr(key:String):String
//		{
//			if(txtConfig == null)
//			{
//				txtConfig	=	new TextData();
//			}
//			return txtConfig.getText(key);
//		}
//		
//		/**
//		 * 带文本替换功能的字符串 
//		 * @param key			字符串索引
//		 * @param valArr		填充值数组
//		 * @return 
//		 * 
//		 */		
//		public static function getStrVar(key:String,valArr:Array):String
//		{
//			if(txtConfig == null)
//			{
//				txtConfig	=	new TextData();
//			}
//			return txtConfig.getTextVar(key,valArr);
//		}
		
		/**
		 * 带文本替换功能的字符串
		 * @param StrID
		 * @param valArr
		 * @return 
		 * 
		 */		
		public static function getSwfLangStrVar(StrID:String,valArr:Array):String
		{
			if(langData == null)
			{
				return StrID;
			}			
			var data:*	=	langData[StrID];
			
			if(data == null)
			{
				return StrID;			
			}
			
			var strData:String = String(data);
			
			var dataarray	:Array = [];			
			var indexpre	:int;
			var indexback	:int;
			var strget		:String;
			
			indexpre 	= strData.indexOf("{");
			indexback 	= strData.indexOf("}");
			
			//下一次搜索的起始偏移量,防止{@}嵌套时，造成死循环
			var nextOffset:uint	=	0;
			
			var firstIndex : int;
			
			var strFlagPre		:int;
			var strFlagBack		:int;
			var strFlag			:String;
			
			while (indexpre != -1 && indexback != -1)
			{
				strget = strData.substring(indexpre, indexback + 1);
				
				firstIndex= strData.indexOf("@",nextOffset);
//				var number		:int 	= int(strData.charAt(strData.indexOf("@",nextOffset) + 1));
				var number		:int	= int( strData.substring( firstIndex + 1, strData.indexOf(":",firstIndex) ) );
				
				//处理填充字符串参数（如果有）
				strFlagPre	=	strData.indexOf("!#[",nextOffset) + 3;
				
				if(strFlagPre > 2)
				{
					//前缀{!#[PeerageRank_]@0:}
					strFlagBack		=	strData.indexOf("]@",nextOffset);
					strFlag			=	strData.substring(strFlagPre,strFlagBack);
					valArr[number]	=	getSwfLangStr(strFlag+valArr[number]);
				}	
				
				var strreplace	:String	=	String(valArr[number]);
				
				strData 	= strData.replace(strget, strreplace);		
				
				nextOffset	=	indexpre + strreplace.length;
				
				indexpre 	= strData.indexOf("{",nextOffset);
				indexback 	= strData.indexOf("}",nextOffset);
			}
			
			return strData;
		}
		
		/**
		 * 获取配置好的字符串
		 * @param StrID
		 * @return 
		 * 
		 */		
		public static function getSwfLangStr(StrID:String):String
		{
			if(langData == null)
			{
				return StrID;
			}
			
			var data:*	=	langData[StrID];
			
			if(data == null)
			{
				return StrID;
			}
			return String(data)
		}
		
//		/**
//		 * 获取配置文件值
//		 * @param keyClass
//		 * @param configID
//		 * @param valKey
//		 * @return 
//		 * 
//		 */		
//		public static function getSwfConfigVal(keyClass:String,configID:String,valKey:String):String
//		{
//			var data:*	=	StaticIni.getSwfConfigObj(keyClass,configID);
//			
//			if(data == null)
//			{
//				return null
//			}
//			else
//			{
//				return data[valKey];
//			}
//		}
//		
//		/**
//		 * 获取配置文件对象
//		 * @param keyClass
//		 * @param configID
//		 * @return 
//		 * 
//		 */		
//		public static function getSwfConfigObj(keyClass:String,configID:String):Object
//		{
//			return ResManager.getResContent("ConfigData")["getValObj"](keyClass,configID);
//		}
		
//		/**
//		 * 检查并初始化配置文件数据源 
//		 * @return true时数据源可用
//		 * 
//		 */		
//		private static function get haveConfig():Boolean
//		{
//			if(configClass == null)
//			{
//				configClass	=	ResManager.getResContent("ConfigData");
//				
//				langData	=	configClass["getValObj"]
//			}
//			if(configClass == null)
//			{
//				return false;
//			}
//			return true;
//		}
		
		public	static	function initStaticFromObj(objData:Object):void
		{
			if(configClass == null)
			{
				configClass	=	objData;
				langData	=	configClass["getClassObj"]("Lang");
				iniData		=	configClass["getClassObj"]("IniClass");
			}
		}
		
//		private static function get haveConfigClass():Boolean
//		{
//			if(configClass == null)
//			{
//				configClass	=	ResManager.getResContent("ConfigData");
//				langData	=	configClass["getClassObj"]("Lang");
//				iniData		=	configClass["getClassObj"]("IniClass");
//				return true;
//			}
//			if(configClass == null)
//			{
//				return false;
//			}
//			return true;
//		}
		
//		private static function get haveLangConfig():Boolean
//		{
//			if(haveConfigClass)
//			{
//				if(langData == null)
//				{
//					return false;
//				}
//				else
//				{
//					return true;
//				}
//			}
//			else
//			{
//				return false;
//			}
//		}
		
		/**
		 * 获取配置信息 
		 * @param configID
		 * @return 
		 * 
		 */		
		public static function getIniObj(configID:String):Object
		{
			if(iniData == null)
			{
				return null;
			}
			if(!iniData.hasOwnProperty(configID))
			{
				return null;
			}
			if(iniData[configID] is XML)
			{
				iniData[configID]	=	CJSON.decode(iniData[configID]);
			}
			return iniData[configID];
//			return JSON.decode(iniData[configID]);
		}
		
		/**
		 * 获取Ini配置信息值
		 * @param configID
		 * @param valKey
		 * @return 
		 * 
		 */		
		public static function getIniVar(configID:*,valKey:String):String
		{
			if(iniData == null)
			{
				return "";
			}
			var dataobj:Object	=	getIniObj(String(configID));
			
			if(dataobj == null)
			{
				return "";
			}
			else if(!dataobj.hasOwnProperty(valKey))
			{
				return ""
			}
			else				
			{
				return dataobj[valKey];
			}
		}
		
		public static function getClipClass(loadinfo:LoaderInfo,ClassPath:String):Class
		{
			return loadinfo.applicationDomain.getDefinition(ClassPath) as Class;
		}
		
		/**
		 * 根据显示对象的 LoaderInfo 和类路径 获取静态类实例。<br>
		 * 注意：<br>
		 * 显示对象所承载的类必须实现公共函数getInstance()，并返回其静态实例。
		 * @param loadinfo	显示对象属性
		 * @param ClassPath	类路径
		 * @param argc		初始化所用到的参数
		 * @return 
		 * 
		 */
		public static function getStaticClipClassInstance(loadinfo:LoaderInfo,ClassPath:String,...argc):Object
		{
			return getClipClass(loadinfo,ClassPath)["getInstance"](argc);
		}
	}
}